package com.sice.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Objects;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //JFrame 界面,窗体
    //子类呢,也表示界面,窗体
    //GameFrame这个界面表示的就是游戏的主界面
    //加载图片时候,会根据二维数组中的数据进行加载

    //创建选项下方的条目对象
    JMenuItem girl = new JMenuItem("美女");
    JMenuItem animal = new JMenuItem("动物");
    JMenuItem sport = new JMenuItem("运动");
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");

    JMenuItem accountItem=new JMenuItem("游戏帮助");


    int[][]data=new int[4][4];

    //记录空白方块在数组中的位置
    int x=0;
    int y=0;

    int [][]win=new int[][]{
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,0}
    };
    //定义变量用来记步数
    int step=0;

    String path="src\\image\\animal\\animal4\\";
    public GameJFrame (){
        //初始化界面
        InitJFrame();

        //初始化菜单
        initJMenu();

        //初始化数据(打乱)
        initData();
        //初始化图片
        initImage();
        this.setVisible(true);   //默认窗口是关闭的,使用该方法将窗口展示
    }


    //初始化数据,将图片打乱
    private void initData() {
        //定义一个数组
        int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random random=new Random();
        //将一维数组中的数据进行打乱
        for (int i = 0; i <arr.length ; i++) {
            int index=random.nextInt(arr.length);
            int temp=arr[index];
            arr[index]=arr[i];
            arr[i]=temp;
        }

        //将一维数组中的数据插入到二维数组中
        for (int i = 0; i <arr.length ; i++) {
            if(arr[i]==0){
                x=i/4;
                y=i%4;
            }
                data[i/4][i%4]=arr[i];
        }
    }

    private void initImage() {

        //清空原来已经出现的所有图片
        this.getContentPane().removeAll();

        if(victory()){
            //显示胜利图标
            JLabel winJLabel=new JLabel(new ImageIcon("src/image/win.png"));
            winJLabel.setBounds(203,283,197,73);
            this.add(winJLabel);
        }


        JLabel stepJLabel=new JLabel("步数"+step);
        stepJLabel.setBounds(50,30,100,20);
        this.add(stepJLabel);

        for (int i=0;i<4;i++) {
            for (int j = 0; j <4; j++) {
                int number=data[i][j];
                //创建一个jLabel的对象(管理容器)
                JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
                //指定图片位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片增加边框
                jLabel.setBorder(new BevelBorder(1));
                //添加图片
                this.add(jLabel);
            }
        }

        //设置背景图片
        JLabel background=new JLabel(new ImageIcon("src\\image\\background.png"));
        background.setBounds(40,40,508,560);
        this.add(background);

        //刷新一下页面

        this.getContentPane().repaint();




    }


    private void initJMenu() {
        //初始化菜单
        //创建整个菜单对象
        JMenuBar jMenuBar=new JMenuBar();
        //创建菜单上两个选项的对象(功能,关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("游戏帮助");
        JMenu changeImage = new JMenu("更换图片");

        //把美女，动物，运动添加到更换图片当中
        changeImage.add(girl);
        changeImage.add(animal);
        changeImage.add(sport);


        //将每一个选项下面的条目添加到选项中
        functionJMenu.add(changeImage);
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        changeImage.add(girl);
        changeImage.add(animal);
        changeImage.add(sport);

        aboutJMenu.add(accountItem);


        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        girl.addActionListener(this);
        animal.addActionListener(this);
        sport.addActionListener(this);
        //将菜单里面的两个选项添加到菜单当中去

        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);



        //给整个页面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void InitJFrame() {
        //设置长宽
        this.setSize(603,680);
        //设置UI标题
        this.setTitle("拼图单机版1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //摄制界面居中
        this.setLocationRelativeTo(null);
        //设置游戏的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//这里是通过更改参数实现点击×会实现什么功能
        //取消默认的居中方式,只有取消了才能实现xy坐标添加组件
        this.setLayout(null);
        //给整个界面添加监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //按下不松时调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        if(code==65){
            //把界面中所有图片全部删除
            this.getContentPane().removeAll();

            //加载第一张完整图片
            JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
            all.setBounds(83,134,420,420);
            this.add(all);
            //加载背景图片
            JLabel background=new JLabel(new ImageIcon("src\\image\\background.png"));
            background.setBounds(40,40,508,560);
            this.add(background);
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    //松开按键时候会调用该方法
    @Override
    public void keyReleased(KeyEvent e) {

        if(victory()){
            return;
        }
        //对上,下,左,右
        int code=e.getKeyCode();
        if(code==37){
            System.out.println("向左移动");
            if(y==3){
                return;
            }
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            initImage();
            step++;
        }else if(code==38) {
            System.out.println("向上移动");
            if(x==3){
                return;
            }
            //逻辑
            //把空白方块与下方的图片进行交换
            data[x][y] = data[x + 1][y];
            data[x + 1][y] = 0;
            x++;
            //每移动一次就加步数
            step++;
            initImage();
        }else if(code==39){
            System.out.println("向右移动");
            if(y==0){
                return;
            }
            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            step++;
            initImage();
        }else if(code==40){
            System.out.println("向下移动");
            if(x==0){
                return;
            }
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            step++;
            initImage();
        }else if(code==65){
            initImage();
        }else if(code==87){
            data=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            initImage();
        }
    }

    //判断胜利
    private boolean victory(){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if (data[i][j]!=win[i][j]) {
                    //只要有一个数据不一样则返回false
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前被点击的条目对象
        Object obj=e.getSource();
        //判断
        if(obj==replayItem){
            System.out.println("重新游戏");

            //计步器清零
            step=0;
            //再次打乱
            initData();
            //重新加载
            initImage();

        }else if(obj==reLoginItem){
            System.out.println("重新登录");
            //关闭当前界面
            this.setVisible(false);
            //打开登录界面
            new LoginFrame();
        }else if(obj==closeItem){
            System.out.println("关闭游戏");
            System.exit(0);
        }else if(obj==accountItem){
            System.out.println("游戏帮助");
            //创建一个弹框对象
            JDialog jDialog=new JDialog();
            //创建一个管理图片的容器对象
            JLabel jLabel=new JLabel(new ImageIcon("src/image/help.png"));
            jLabel.setBounds(0,0,258,258);
            jDialog.getContentPane().add(jLabel);

            //给弹框设置大小
            jDialog.setSize(344,344);
            //让弹窗顶置
            jDialog.setAlwaysOnTop(true);
            //让弹窗注重
            jDialog.setLocationRelativeTo(null);
            //弹窗不关闭则无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }else if (obj == girl) {
            path = getRandomPath("girl");
            resetGame();
        }
        // 更换图片（动物）
        else if (obj == animal) {
            path = getRandomPath("animal");
            resetGame();
        }
        // 更换图片（运动）
        else if (obj == sport) {
            path = getRandomPath("sport");
            resetGame();
        }
    }
    //获取图片路径
    private String getRandomPath(String type) {
        String base = "src/image/" + type + "/";
        File file = new File(base);
        File[] files = file.listFiles();
        if (files == null || files.length == 0) {
            return "src/image/animal/animal4/"; // 默认路径
        }
        // 随机选一个子目录
        int index = new Random().nextInt(files.length);
        return files[index].getAbsolutePath() + "/";
    }

    // 重置游戏
    private void resetGame() {
        step = 0;
        initData();
        initImage();
    }
}
